/*
		模拟实现atoi函数

		夏思成

		2024年4月15日

		西科大15号公寓楼
*/


#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>

enum judge
{
	VAILD,
	INVAILD
}Sta;
int my_atoi(const char* p)
{
	assert(p);

	//跳过前面的空白字符
	while (isspace(*p))
	{
		p++;
	}
	
	//判断转换后该数的正负
	int flag = 1;
	if (*p == '-')
	{
		flag = -1;
		p++;
	}
	else if (*p == '+')
	{
		p++;
	}

	//转化字符为数字，只需将每个数字字符减去数字字符‘0’即可
	int sum = 0;
	while (*p != '\0')
	{
		if (isdigit(*p))
		{
			sum = flag * (*p - '0') + sum * 10;
		}
		else
		{
			Sta = INVAILD;
			return sum;
		}
		if (sum > INT_MAX)
		{
			sum = INT_MAX;
			return sum;
		}
		if (sum < INT_MIN)
		{
			sum = INT_MIN;
			return sum;
		}
		//遇到非数字字符直接返回sum
		
		p++;
	}
	Sta = VAILD;
	return sum;
}

int main()
{
	int ret = my_atoi("   -123");
	if (Sta == VAILD)
	{
		printf("合法转换:%d\n", ret);
	}
	else if (Sta == INVAILD)
	{
		printf("非法转换:%d\n", ret);
	}
	return 0;
}